home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / net / netArp.h < prev    next >
C/C++ Source or Header  |  1992-12-18  |  4KB  |  131 lines

  1. /*
  2.  * netArp.h --
  3.  *
  4.  *    Declarations for arp and rarp.
  5.  *
  6.  * Copyright 1990 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  *
  15.  * $Header: /cdrom/src/kernel/Cvsroot/kernel/net/netArp.h,v 1.3 92/06/03 22:47:49 voelker Exp $ SPRITE (Berkeley)
  16.  */
  17.  
  18. #ifndef _NETARP
  19. #define _NETARP
  20.  
  21. /*
  22.  * Sprite Address Resolution Protocol packet format.  These are used to
  23.  * find out Sprite IDs for physical addresses and vice versa.  The ARP
  24.  * protocol is simple:  a host broadcasts an Arp Request containing a
  25.  * Sprite ID and waits for a reply that specifies the physical (ethernet)
  26.  * address used to reach that Sprite host.  The Reverse Arp protocol is
  27.  * similar.  A host broadcasts a request that contains a a physical
  28.  * (ethernet) address and waits for a reply that specifies the matching
  29.  * Sprite ID. 
  30.  *
  31.  * NOTE: This packet appears on the wire in network byte ordering.
  32.  *
  33.  */
  34.  
  35. #define    NUM_ARP_DATA_BYTES (2 * (sizeof(Net_EtherAddress) + sizeof(int)))
  36.  
  37. typedef struct NetSpriteArp {
  38.     Net_ArpHeader arpHeader;    /* RFC826 standard header. The hardware addr
  39.                  * space should be NET_ARP_TYPE_ETHER.  */
  40.     unsigned char arpData[NUM_ARP_DATA_BYTES];
  41. } NetSpriteArp;
  42.  
  43. /*
  44.  * Macros for indexing into the arpData field.
  45.  * ARP_SRC_ETHER_ADDR() - The address of the sender's ethernet address.
  46.  * ARP_SRC_PROTO_ADDR() - The address of the sender's protocol address.
  47.  * ARP_TARGET_ETHER_ADDR() - The address of the target's ethernet address.
  48.  * ARP_TARGET_PROTO_ADDR() - The address of the target's protocol address.
  49.  */
  50.  
  51. #define ARP_SRC_ETHER_ADDR(ap) ((Net_EtherAddress *) &((ap)->arpData[0]))
  52. #define ARP_SRC_PROTO_ADDR(ap) \
  53.         ((char *) &((ap)->arpData[(ap)->arpHeader.hardwareAddrLen]))
  54. #define    ARP_TARGET_ETHER_ADDR(ap) \
  55.         ((Net_EtherAddress *) \
  56.         &((ap)->arpData[(ap)->arpHeader.hardwareAddrLen + \
  57.                      (ap)->arpHeader.protocolAddrLen]))
  58. #define    ARP_TARGET_PROTO_ADDR(ap) \
  59.         ((char *) &((ap)->arpData[2*(ap)->arpHeader.hardwareAddrLen + \
  60.                      (ap)->arpHeader.protocolAddrLen]))
  61.  
  62.  
  63.  
  64.  
  65. /*
  66.  * State for the Address Resolution Protocol.
  67.  */
  68. typedef struct ArpState {
  69.     List_Links        links;        /* Chain for all current ARPs */
  70.     int            state;        /* See bits defined below */
  71.     Timer_QueueElement    timeout;    /* Used for the call-back upon timeout*/
  72.     Sync_Semaphore    *mutexPtr;    /* Used for synchronization */
  73.     Sync_Condition    condition;    /* Used for synchronization */
  74.     int            type;        /* Type of request. */
  75.     ClientData        id;        /* Target ID, used to identify
  76.                      * this ARP transaction from others */
  77.     NetSpriteArp    packet;        /* Copy of reply packet */
  78. } ArpState;
  79.  
  80. #define ARP_WANT_REPLY        0x1
  81. #define ARP_HAVE_INPUT        0x2
  82. #define ARP_IN_TIMEOUT_QUEUE    0x4
  83.  
  84. typedef struct ArpStatisitics {
  85.     int    numArpRequests;        /* Number of these transmitted */
  86.     int numArpReplies;        /* ditto */
  87.     int numRevArpRequests;    /* ditto */
  88.     int numRevArpReplies;    /* ditto */
  89.     int numTimeouts;        /* Number of requests that were not responded
  90.                  * to after a few broadcast attempts */
  91. } ArpStatistics;
  92.  
  93. /*
  94.  * A very simple packet list used to keep Arp packet headers and
  95.  * the scatter/gather structure used to access them.  These must be
  96.  * global data structures because the packet may be queued before output.
  97.  * A monitor is used to synchronize access
  98.  */
  99. typedef struct ArpOutputQueue {
  100.     Net_Interface    *interPtr;
  101.     Net_EtherHdr    etherHdr;
  102.     NetSpriteArp    packet;
  103.     Net_ScatterGather    gather;
  104. } ArpOutputQueue;
  105.  
  106. #define ARP_OUTPUT_QUEUE_LEN        3
  107.  
  108. /*
  109.  * Another simple list of Arp packets used to pass info
  110.  * from the interrupt handler that gets an ARP request to the
  111.  * Proc_ServerProc that generates the reply.
  112.  */
  113.  
  114. typedef struct ArpInputQueue {
  115.     Net_Interface    *interPtr;
  116.     NetSpriteArp    packet;
  117. } ArpInputQueue;
  118.  
  119. #define ARP_INPUT_QUEUE_LEN        5
  120.  
  121. /*
  122.  * Forward declarations.
  123.  */
  124. extern ReturnStatus    NetDoArp _ARGS_((Net_Route *routePtr,
  125.                 Sync_Semaphore *mutexPtr, int command, 
  126.                 Net_ScatterGather *gatherPtr, 
  127.                 NetSpriteArp *packetPtr));
  128.  
  129. #endif /* _NETARP */
  130.  
  131.